package com.example.rabc.monitor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Map;

/**
 * 告警处理器，根据监控数据生成告警
 */
@Component
public class AlertProcessor implements MonitorObserver {
    private static final Logger alertLogger = LoggerFactory.getLogger("ALERT"); // 告警日志记录器

    /**
     * 处理系统指标事件，根据指标生成告警
     * @param event 监控事件
     */
    @Override
    public void update(MonitorEvent event) {
        if ("SYSTEM_METRICS".equals(event.getEventType())) { // 仅处理系统指标事件
            Map<String, Object> data = event.getData();
            Double cpuUsage = getDoubleValue(data.get("cpuUsage"));
            Double heapUsagePercent = getDoubleValue(data.get("heapUsagePercent"));
            
            // CPU使用率超过80%告警
            if (cpuUsage != null && cpuUsage > 80) {
                alertLogger.warn("High CPU usage detected: {}%", String.format("%.2f", cpuUsage));
            }
            
            // 内存使用率超过85%告警
            if (heapUsagePercent != null && heapUsagePercent > 85) {
                alertLogger.warn("High memory usage detected: {}%", String.format("%.2f", heapUsagePercent));
            }
        } else if ("METHOD_PERFORMANCE".equals(event.getEventType())) { // 仅处理方法性能事件
            Map<String, Object> data = event.getData();
            Boolean success = (Boolean) data.get("success");
            Number executionTime = (Number) data.get("executionTime");
            
            // 方法执行失败告警
            if (success != null && !success) {
                alertLogger.error("Method execution failed: {}", data);
            }
            
            // 方法执行时间超过阈值告警（假设阈值为5000ms）
            if (executionTime != null && executionTime.longValue() > 5000) {
                alertLogger.warn("Slow method execution detected: {}ms for method: {}", 
                                executionTime, data.get("method"));
            }
        }
    }

    /**
     * 尝试将对象转换为Double值
     * @param value 要转换的值
     * @return 转换后的Double值，或null如果转换失败
     */
    private Double getDoubleValue(Object value) {
        if (value instanceof Number) {
            return ((Number) value).doubleValue();
        }
        return null;
    }

    /**
     * 判断是否支持处理指定类型的事件
     * @param eventType 事件类型
     * @return 是否支持
     */
    @Override
    public boolean supportsEventType(String eventType) {
        // 仅支持系统指标事件和方法性能事件
        return "SYSTEM_METRICS".equals(eventType) || "METHOD_PERFORMANCE".equals(eventType);
    }
}